package cn.lingyangwl.agile.system.service;

import cn.lingyangwl.agile.system.model.entity.SysTenant;
import cn.lingyangwl.agile.system.model.rqrs.tenant.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * @author shenguangyang
 */
public interface SysTenantService extends IService<SysTenant> {
    List<SysTenant> pageTenant(Integer pageNum, Integer pageSize);

    SysTenant validTenant(String id);

    /**
     * 查询有效的租户
     * 该方法仅查询有效的租户，如果返回0个就说明所有的租户均无效。
     * @deprecated
     */
    List<SysTenant> listEffectiveTenant(Collection<String> idList);

    TenantResp getEffectiveTenant(String id);

    /**
     * 返回某个租户被多少个用户引用了
     */
    long countUserLinkTenant(Long id);

    /**
     * 根据ID删除租户，会判断是否已被引用
     */
    void deleteTenant(String id);

    void batchDeleteTenant(List<String> idList);

    /**
     * 查询
     * @param query 查询条件
     * @return 结果
     */
    IPage<TenantResp> pageTenant(TenantPageReq query);

    /**
     * 查询全部
     */
    List<SysTenant> listAll();

    String saveTenant(TenantSaveReq req);

    boolean updateTenant(TenantUpdateReq req);

    /**
     * 更新租户的角色菜单
     *
     * @param tenantId 租户编号
     * @param menuIds 菜单编号数组
     */
    void updateTenantRoleMenu(String tenantId, Set<Long> menuIds);

    TenantResp getTenantById(String id);

    /**
     * @deprecated
     */
    SysTenant getByDomain(String domain);

    /**
     * 获取租户配置
     */
    TenantConfigResp getConfig();

    /**
     * 租户所有者更新租户信息
     */
    void updateOwnerTenant(TenantOwnerUpdateReq req);

    /**
     * 获取用户当前租户, 如果是第一次就选择第一个租户作为默认登录租户
     * @param userId 用户id
     */
    SysTenant getUserCurrentTenant(Long userId);

    /**
     * 通过租户id获取管理其场景的租户id
     * @param tenantId 租户id
     * @return 管理其场景的租户id
     */
    String getMgtSceneTenantId(String tenantId);

    /**
     * 获取主租户id
     * @param tenantId 租户id
     */
    String getMainTenantId(String tenantId);

    /**
     * 获取指定租户的所有子租户
     */
    List<TenantResp> listSubTenant(String tenantId);

    List<TenantResp> listTenantByIds(List<String> tenantIds);
}
